using System;
using System.Configuration;
using System.Web;
using System.Web.Caching;
using System.Web.UI;
using SystemFrameworks;
using Anthem;
using BusinessRules;
using Common;
using DataAccess;
using UsrControls;

namespace web.Controls
{
    /// <summary>
    ///	Summary description ZonasGeograficas
    /// </summary>
    public class ZonasGeograficas : UserControl
    {
        protected DropDownBase dlpMunicipios;
        protected DropDownBase dlpDepartamentos;

        #region Controles, Objetos, Constantes

        BasZonasGeograficas objBR = new BasZonasGeograficas(ConfigurationManager.AppSettings["Conn"]);
        BasZonasGeograficasData objData = new BasZonasGeograficasData();
        protected string mstrClassLabels = "camporequerido";
        protected RequiredFieldValidator reqDepartamento;
        protected RequiredFieldValidator reqMunicipio;
        static Cache _cache = HttpContext.Current.Cache;
        #endregion

        #region Propiedades Publicas

        public bool isLoaded
        {
            set
            {
                Session["isLoadedX"] = value;
            }
            get
            {
                if (Session["isLoadedX"] != null)
                    return (bool)Session["isLoadedX"];
                return false;
            }
        }

        public string DepartamentoSeleccionado
        {
            get { return dlpDepartamentos.SelectedValue; }
            set
            {
                ViewState["DepartamentoSeleccionado"] = value;
            }
        }

        public string NombreDepartamentoSeleccionado
        {
            get { return dlpDepartamentos.SelectedText; }
        }


        public string MunicipioSeleccionado
        {
            get
            {
                if (dlpMunicipios.SelectedValue == "")
                {
                    return dlpDepartamentos.SelectedValue;
                }
                return dlpMunicipios.SelectedValue;
            }
            set
            {
                ViewState["MunicipioSeleccionado"] = value;
            }
        }

        public string NombreMunicipioSeleccionado
        {
            get
            {
                return dlpMunicipios.SelectedText;
            }
        }


        public bool BusquedaMunicipio
        {
            get
            {
                return dlpMunicipios.SearchVisible;
            }
            set
            {
                dlpMunicipios.SearchVisible = value;
            }
        }

        public bool BusquedaDepartamento
        {
            get
            {
                return dlpDepartamentos.SearchVisible;
            }
            set
            {
                dlpDepartamentos.SearchVisible = value;
            }
        }

        public bool Enabled
        {
            set
            {
                dlpDepartamentos.Enabled = value;
                dlpMunicipios.Enabled = value;
                dlpDepartamentos.UpdateAfterCallBack = true;
                dlpMunicipios.UpdateAfterCallBack = true;
            }
        }

        public string ClassLabels
        {
            set
            {
                mstrClassLabels = value;
            }
        }

        public bool DepartamentoObligatorio
        {
            get
            {
                return reqDepartamento.Enabled;
            }
            set
            {
                reqDepartamento.Enabled = value;
            }
        }

        public bool MunicipioObligatorio
        {
            get
            {
                return reqMunicipio.Enabled;
            }
            set
            {
                reqMunicipio.Enabled = value;
            }
        }

        #endregion

        #region Metodos Privados
        private void CargaDpto()
        {
            try
            {
                if (Cache[Utilidad._CACHE_DEPARTAMENTOS] != null)
                {
                    objData = (BasZonasGeograficasData)Cache[Utilidad._CACHE_DEPARTAMENTOS];
                }
                else
                {
                    objData = objBR.BuscarZonasGeograficas();
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationExceptionManager(ex.Message, ex);
            }

            dlpDepartamentos.BindData(objData, BasZonasGeograficasData.ZON_NOMBRE_FIELD, BasZonasGeograficasData.ZON_ID_FIELD);

            if (dlpDepartamentos.Count > 0 && ViewState["DepartamentoSeleccionado"] != null)
            {
                dlpDepartamentos.SelectedValue = ViewState["DepartamentoSeleccionado"].ToString();
            }
            else if (dlpDepartamentos.Count > 0 && ViewState["MunicipioSeleccionado"] != null)
            {
                ViewState["DepartamentoSeleccionado"] = ViewState["MunicipioSeleccionado"].ToString().Substring(0, 2);
                dlpDepartamentos.SelectedValue = ViewState["DepartamentoSeleccionado"].ToString();
            }

            if (this.DepartamentoObligatorio)
            {
                dlpDepartamentos.AddItem(Utilidad.SELECCIONE, "", 0);
            }
        }

        private void CargaMunicipio()
        {
            if (dlpDepartamentos.Count > 0)
            {
                try
                {
                    objData = CargarMunicipios(dlpDepartamentos.SelectedValue);
                }
                catch (Exception ex)
                {
                    throw new ApplicationExceptionManager(ex.Message, ex);
                }
                dlpMunicipios.BindData(objData, BasZonasGeograficasData.ZON_NOMBRE_FIELD, BasZonasGeograficasData.ZON_ID_FIELD);

                if (ViewState["DepartamentoSeleccionado"] != null)
                {
                    dlpMunicipios.SelectedValue = ViewState["MunicipioSeleccionado"].ToString();
                }
            }

            if (this.MunicipioObligatorio)
            {
                dlpMunicipios.AddItem(Utilidad.SELECCIONE, "", 0);
            }
        }

        #endregion

        #region Eventos
        private void Page_Load(object sender, EventArgs e)
        {
            Manager.Register(this);
            if (!IsPostBack)
            {
                CargaDpto();
                CargaMunicipio();
                isLoaded = true;
            }
        }
        private void dlpDepartamentos_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (dlpDepartamentos.Count > 0)
            {
                dlpMunicipios.Enabled = false;
                try
                {
                    objData = CargarMunicipios(dlpDepartamentos.SelectedValue);
                }
                catch (Exception ex)
                {
                    throw new ApplicationExceptionManager(ex.Message, ex);
                }
                dlpMunicipios.BindData(objData, BasZonasGeograficasData.ZON_NOMBRE_FIELD, BasZonasGeograficasData.ZON_ID_FIELD);

                dlpMunicipios.Enabled = true;

            }

            if (this.MunicipioObligatorio)
            {
                dlpMunicipios.AddItem(Utilidad.SELECCIONE, "", 0);
            }

        }
        #endregion


        /// <summary>
        /// consulta los departamentos y los almacena en CACHE
        /// </summary>
        static BasZonasGeograficasData CargarMunicipios(string strIdDepartamento)
        {
            try
            {
                BasZonasGeograficasData zonasGeograficasData = null;

                if (_cache[Utilidad._CACHE_MUNICIPIOS] != null)
                {
                    zonasGeograficasData = (BasZonasGeograficasData)_cache[Utilidad._CACHE_MUNICIPIOS];
                    zonasGeograficasData.DefaultView.RowFilter = String.Format("{0}='{1}'", BasZonasGeograficasData.ZON_PADRE_ID_FIELD, strIdDepartamento);
                }

                return zonasGeograficasData;
            }
            catch (Exception ex)
            {
                throw new ApplicationExceptionManager(ex.Message, ex);
            }
        }



        #region Web Form Designer generated code
        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }

        private void InitializeComponent()
        {
            this.dlpDepartamentos.SelectedIndexChanged += new System.EventHandler(this.dlpDepartamentos_SelectedIndexChanged);
            this.Load += new System.EventHandler(this.Page_Load);

        }
        #endregion

        #region Metodos Publicos
        /// <summary>
        /// Permite asignar Dpto y Municipio
        /// </summary>
        public void AsignarValores(string CodZona)
        {
            if (CodZona != "")
            {
                string strDpto = CodZona.Substring(0, 2);

                this.CargaDpto();

                try
                {
                    //this.CargaDpto();
                    objData = CargarMunicipios(strDpto);
                }
                catch (Exception ex)
                {
                    throw new ApplicationExceptionManager(ex.Message, ex);
                }
                dlpMunicipios.BindData(objData, BasZonasGeograficasData.ZON_NOMBRE_FIELD,
                                       BasZonasGeograficasData.ZON_ID_FIELD);

                if (MunicipioObligatorio)
                {
                    dlpMunicipios.AddItem(Utilidad.SELECCIONE, "", 0);
                }
                ViewState["DepartamentoSeleccionado"] = strDpto;
                ViewState["MunicipioSeleccionado"] = CodZona;
                dlpDepartamentos.SelectedValue = strDpto;
                dlpMunicipios.SelectedValue = CodZona;
            }

        }

        public void Enable(bool enabled)
        {
            dlpDepartamentos.Enabled = enabled;
            dlpDepartamentos.UpdateAfterCallBack = true;
            dlpMunicipios.Enabled = enabled;
            dlpMunicipios.UpdateAfterCallBack = true;
            reqDepartamento.Enabled = enabled;
            reqDepartamento.UpdateAfterCallBack = true;
            reqMunicipio.Enabled = enabled;
            reqMunicipio.UpdateAfterCallBack = true;

            if (MunicipioObligatorio && !enabled)
            {
                dlpMunicipios.Items.Clear();
                dlpMunicipios.AddItem(Utilidad.SELECCIONE, "", 0);

            }

        }

        public void cargarDatosZona()
        {
            CargaDpto();
            CargaMunicipio();
        }
        #endregion
    }

}